<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Description of Aranha
 *
 * @author Bruno
 */

class Aranha {

    
    private $int_idAranha;
    private $boo_aranhaAtiva = true;
    private $boo_pause = false;
    private $boo_bloqueada = false;
    private $boo_conteudo = false;
    private $str_resumoErro = '';
    private $int_codigoErro = 0;
    private $int_httpCodigo = -1;
    private $str_paginaEndereco = "";
    private $str_paginaCharset = 'UTF-8';
    private $str_codigoFonte = '';
    private $arr_linksEncontrados = array();
    private $arr_linksValidos = array();

    function __construct($id_aranha) {
        $this->int_idAranha = $id_aranha;
    }

    public function getInt_httpCodigo() {
        return $this->int_httpCodigo;
    }

    public function setInt_httpCodigo($int_httpCodigo) {
        $this->int_httpCodigo = $int_httpCodigo;
    }

    public function getStr_resumoErro() {
        return $this->str_resumoErro;
    }

    public function getInt_codigoErro() {
        return $this->int_codigoErro;
    }

    public function setStr_resumoErro($str_resumoErro) {
        $this->str_resumoErro = $str_resumoErro;
    }

    public function setInt_codigoErro($int_codigoErro) {
        $this->int_codigoErro = $int_codigoErro;
    }

    public function getStr_codigoFonte() {
        return $this->str_codigoFonte;
    }

    public function setStr_codigoFonte($str_codigoFonte) {
        $this->str_codigoFonte = $str_codigoFonte;
    }

    public function getInt_idAranha() {
        return $this->int_idAranha;
    }

    public function getBoo_aranhaAtiva() {
        return $this->boo_aranhaAtiva;
    }

    public function getBoo_pause() {
        return $this->boo_pause;
    }

    public function getBoo_bloqueada() {
        return $this->boo_bloqueada;
    }

    public function getBoo_conteudo() {
        return $this->boo_conteudo;
    }

    public function getStr_paginaEndereco() {
        return $this->str_paginaEndereco;
    }

    public function getStr_paginaCharset() {
        return $this->str_paginaCharset;
    }

    public function getArr_linksEncontrados() {
        return $this->arr_linksEncontrados;
    }

    public function getArr_linksValidos() {
        return $this->arr_linksValidos;
    }

    public function setInt_idAranha($int_idAranha) {
        $this->int_idAranha = $int_idAranha;
    }

    public function setBoo_aranhaAtiva($boo_aranhaAtiva) {
        $this->boo_aranhaAtiva = $boo_aranhaAtiva;
    }

    public function setBoo_pause($boo_pause) {
        $this->boo_pause = $boo_pause;
    }

    public function setBoo_bloqueada($boo_bloqueada) {
        $this->boo_bloqueada = $boo_bloqueada;
    }

    public function setBoo_conteudo($boo_conteudo) {
        $this->boo_conteudo = $boo_conteudo;
    }

    public function setStr_paginaEndereco($str_paginaEndereco) {
        $this->str_paginaEndereco = $str_paginaEndereco;
    }

    public function setStr_paginaCharset($str_paginaCharset) {
        $this->str_paginaCharset = $str_paginaCharset;
    }

    public function setArr_linksEncontrados($arr_linksEncontrados) {
        $this->arr_linksEncontrados = $arr_linksEncontrados;
    }

    public function setArr_linksValidos($arr_linksValidos) {
        $this->arr_linksValidos = $arr_linksValidos;
    }

    function IniciarAranha() {

        $this->setStr_resumoErro('Sem erros.');
        $this->setInt_httpCodigo(-1);
        $this->setInt_codigoErro(0);


        if ($this->getBoo_aranhaAtiva()) {

            //Pause ativado
            while ($this->getBoo_pause()) {
                if ($this->getBoo_crawlerAtivo() == false) {
                    //Sai do laço pause
                    break;
                }
            }

            if ($this->getBoo_aranhaAtiva()) {
                $this->setBoo_bloqueada(TRUE);

                if ($this->TestaConexao($this->getStr_paginaEndereco())) {

                    //Requisitando o codigo fonte da pagina
                    $this->setStr_codigoFonte($this->RequisitandoCodigoFonte($this->getStr_paginaEndereco()));
                    if ($this->getStr_codigoFonte() != false &&
                            $this->getStr_codigoFonte() != '') {

                        //Guardando os links encontrados
                        $this->setArr_linksEncontrados($this->RetirarLink($this->getStr_codigoFonte()));
                        if (count($this->getArr_linksEncontrados()) > 0) {

                            //Filtrando os links validos
                            $this->setArr_linksValidos($this->ValidarLinks($this->getArr_linksEncontrados()));

                            if (count($this->getArr_linksValidos()) > 0) {

                                //Exibe em tela E/OU grava em arquivo
                                $this->TesteExibir();
                            } else {
                                $this->setStr_resumoErro('Nenhum link valido encontrado.');
                                $this->setInt_codigoErro(-5);
                            }
                        } else {
                            //
                            $this->setStr_resumoErro('Nenhum link encontrado na pagina.');
                            $this->setInt_codigoErro(-4);
                        }
                    } else {

                        //Erro: Requisitar codigo
                        //Pagina não ONLINE
                        if ($this->getInt_httpCodigo() !== 200) {
                            $this->setStr_resumoErro('Pagina não encontrada.');
                            $this->setInt_codigoErro(-30);

                            //Pagina não BAIXADA
                        } else if ($this->getInt_httpCodigo() === 200 && $this->getStr_codigoFonte() == false) {
                            $this->setStr_resumoErro('Pagina indisponivel no momento.');
                            $this->setInt_codigoErro(-31);
                        }
                    }
                } else {

                    //Pagina indisponivel
                    //Codigo !== 200
                    $this->setInt_codigoErro(-2);
                    $this->setStr_resumoErro('Pagina indisponivel ou OFFLINE');
                }
            } else {
                //Aranha não ativa
                //Grava no LOG e trata a pagina não percorrida
                $this->setInt_codigoErro(-1);
                $this->setStr_resumoErro('Aranha desativada.');
            }
        }//fim IF aranha ativa 1
        else {
            $this->setInt_codigoErro(-1);
            $this->setStr_resumoErro('Aranha desativada.');
        }


        $this->LimparEDesbloquerAranha();
    }

    function RequisitandoCodigoFonte($str_par_site, $str_charset = 'UTF-8') {
        /*
         * Metodos da classe cURL
         * http://translate.google.com.br/translate?hl=pt-BR&sl=en&u=http://www.php.net/manual/en/function.curl-setopt.php&prev=/search%3Fq%3Dphp%2Bcurl%2Bcharset%26es_sm%3D93
         */
        set_time_limit(0);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $str_par_site);
        //curl_setopt($ch, CURLOPT_HEADER, true);//Cabeçalho/header de informações
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //Nega verificação do HTTPS
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_REFERER, '');
//        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_ENCODING, $str_charset);
        $str_ret_codigoFonteSite = curl_exec($ch);

        $int_httpCodigo = (curl_getinfo($ch, CURLINFO_HTTP_CODE));
        $this->setInt_httpCodigo($int_httpCodigo);

        //$str_ret_codigoFonteSite = html_entity_decode(htmlspecialchars($str_ret_codigoFonteSite));


        curl_close($ch);


        return $str_ret_codigoFonteSite;
    }

    function RetirarLink($str_url) {
        // echo $str_url;

        $arr_links = array();

        $dom = new DOMDocument('1.0');
        @$dom->loadHTML($str_url);

        $links = $dom->getElementsByTagName('a');
        foreach ($links as $link) {


            $arr_links[] = trim($link->getAttribute('href') . PHP_EOL);
        }

        return $arr_links;
    }

    function ValidarLinks($arr_linksAValidar) {
        $int_qtdLinks = 0;
        $arr_links = array();
        $int_qtdLinks = count($arr_linksAValidar);

        for ($int_cont = 0; $int_cont < $int_qtdLinks; $int_cont++) {
            //Pegando a posicao $int_cont do array
            $str_link = $arr_linksAValidar[$int_cont];
            //Se não conter '?' e '&'
            if (strpos($str_link, "?") === false &&
                    strpos($str_link, "&") === false) {

                $arr_links[] = ($str_link);
            }
        }

        return $arr_links;
    }

    function TestaConexao($str_url) {
        set_time_limit(0);
        $boo_online = false;
        $str_url = curl_init($str_url);
        curl_setopt($str_url, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($str_url, CURLOPT_HEADER, true);    // captura do head
        curl_setopt($str_url, CURLOPT_NOBODY, true);    // dispensa o body
        //        curl_setopt($str_url, CURLOPT_TIMEOUT, 10);      //aguardar maximo 3 seg.
        curl_setopt($str_url, CURLOPT_SSL_VERIFYPEER, false); //Aceitar pags https
        curl_setopt($str_url, CURLOPT_FOLLOWLOCATION, true); //Não seguir redirecionamento
        curl_exec($str_url);



        $boo_online = (curl_getinfo($str_url, CURLINFO_HTTP_CODE)) == 200 ? true : false;
        curl_close($str_url); //fechando conexao
        return $boo_online;
    }

    function TesteExibir() {
        // Abre ou cria o arquivo bloco1.txt
        // "a" representa que o arquivo é aberto para ser escrito
        $fp = fopen("C:\blocoAranha.txt", "w");
        $data = 'Data:' . date("d/m/Y H:i:s ");

        // Escreve "exemplo de escrita" no bloco1.txt
        $escreve = fwrite($fp, 'O site: "' . $this->getStr_paginaEndereco() . '" ' . $data . PHP_EOL . PHP_EOL);

        $int_qtdLinks = count($this->getArr_linksValidos());


        for ($index = 0; $index < $int_qtdLinks; $index++) {

            // Escreve "exemplo de escrita" no bloco1.txt
            $escreve = fwrite($fp, $this->getArr_linksValidos()[$index] . PHP_EOL);
            echo $index .' - '.$this->getArr_linksValidos()[$index].'<br>';
            }

        // Fecha o arquivo
        fclose($fp);
    }

    function LimparEDesbloquerAranha() {
        //Limpando os atributos
        $this->setStr_codigoFonte('');
        $this->setStr_paginaEndereco('');
        $this->setArr_linksEncontrados(null);
        $this->setBoo_conteudo(true);

        //Desbloqueia o crawler para manutencção
        $this->setBoo_bloqueada(FALSE);
    }

}

$a = new Aranha(1);
$a->setStr_paginaEndereco('http://www.uol.com.br/');
$a->IniciarAranha();
